home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / select / select.008 < prev    next >
Text File  |  1995-02-16  |  6KB  |  268 lines

  1. /*
  2.   r.m=80 tab=4
  3.     =======================================================================
  4.    ==  <<バッチ分岐支援プログラム>>                                       ==
  5.    ==      [ select.exe ]      Ver 0.08                                   ==
  6.    ==                                     1995      Program : Y.Gotoh     ==
  7.     =======================================================================
  8. */
  9.  
  10. /*外部ファイル読み込み */
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <conio.h>
  16. #include <ctype.h>
  17. #include <gds.h>
  18. #include "gotoh.h"
  19.  
  20. /* グローバル変数の設定 */
  21.  
  22. char *wp;            /* GDSで使うワークアドレス */
  23. char *sel[20];        /* select群で使用 */
  24. int end_echo=1;        /* エンディングエコーの表示非表示。初期(1)は表示 */
  25. char *help={
  26.         "\n"
  27.         "             \"select.exe\"  Ver 0.08      1995 : Y.Gotoh (Gori)\n"
  28.         "\n"
  29.         "  select.exe [option] title sel_1 sel_b sel_c ・・・\n"
  30.         "  /h           ・・・ Help             ヘルプを表示します.\n"
  31.         "  /e           ・・・ not Eending echo 終了時メッセージを表示しません.\n"
  32.         "  /b[r][g][b]  ・・・ Back color       [r],[g],[b]で背景を塗ります.\n"
  33.         "\n"
  34.         "  ==メニューの使い方==\n"
  35.         "      [↑],[F],[f]   ・・・・・・・・・・  カーソルを上へ移動\n"
  36.         "      [↓],[J],[j]   ・・・・・・・・・・       〃   下  〃  \n"
  37.         "     [ret],[space]   ・・・・・・・・・・  決定\n"
  38.         "         [0~9]      ・・・・・・・・・・  その番号のメニューを実行\n"
  39.         "     [esc],[Q],[q]   ・・・・・・・・・・  終了\n\n"
  40.         };
  41.  
  42.  
  43. /* 関数の定義 */
  44.  
  45. void waitkey( int wait_time);
  46. void HELP( void );
  47.  
  48. int select(int sel_max);
  49. void select_list(int sel_max);
  50. void select_prt(int sel_no,int sel_bak);
  51.  
  52. /* メイン */
  53.  
  54. int main(int argc , char *argv[])
  55. {
  56.     /* 初期設定 */
  57.     int ret,sel_max=-1,i,j;            /* sel_maxは後の所で修正されるため初期値 */
  58.                                                             /* は(-1)とする */
  59.     int pal[3]={0,0,0};                                        /* 背景パレット */
  60.     char dmy;                                                    /* 雑用char*/
  61.     
  62.     /* GDS使用定義 */
  63.     
  64.     wp=GDS_init(100);                        /* wpはGDSワークアドレス変更禁止 */
  65.     
  66.     /* 画面消去 */
  67.     
  68.     txt_cls();
  69.     GDS_write_page(1);                                    /* page1を使用 */
  70.     GDS_display_page(1);
  71.     GDS_all_clear();
  72.     
  73.     /* タイトル */
  74.     txt_csl(0);
  75.     locate(20,1);
  76.         txt_color(3);
  77.         printf(    "------------------------------------------\n");
  78.     locate(20,2);
  79.         printf(    " [select,exe]     1995 program : Y.Gotoh \n");
  80.     locate(20,3);
  81.         printf(    "------------------------------------------\n");
  82.     txt_color(7);
  83.     
  84.     /* パラメータの読み込み */
  85.     
  86.     if(argc<2)    HELP();                        /* パラメータ無しはヘルプ表示 */
  87.     
  88.     for(i=1;i<argc;i++)
  89.     {
  90.         if(*(argv[i])=='/' || *(argv[i])=='-')
  91.         {
  92.             tolower( *(argv[i]+1) );
  93.             
  94.             switch(*(argv[i]+1))
  95.             {
  96.                 case 'e':
  97.                     end_echo=0;
  98.                 break;
  99.                 
  100.                 case 'h':
  101.                     HELP();
  102.                 break;
  103.                 
  104.                 case 'b':
  105.                     strlwr(argv[i]);
  106.                     for(j=2;j<strlen(argv[i]);j++)
  107.                     {
  108.                         dmy=*(argv[i]+j);
  109.                         
  110.                         if(dmy>=0x61 && dmy<=0x66)
  111.                         {
  112.                             pal[j-2]=(10+(dmy-0x30))*15;
  113.                         }
  114.                         else    pal[j-2]=(atoi(&dmy))*15;
  115.                     }
  116.                     GDS_palette(0,pal[0],pal[1],pal[2]);
  117.                     break;
  118.             }
  119.         }
  120.         else
  121.         {
  122.             sel_max++;
  123.             sel[sel_max]=argv[i];
  124.         }
  125.     }
  126.     
  127.     if(sel_max<2)
  128.     {
  129.         txt_color(1);
  130.         printf("\n選択肢の数が足りません!!\n");
  131.         txt_color(7);
  132.         HELP();
  133.     }
  134.     
  135.     for(i=0;i<=sel_max;i++)
  136.     {
  137.         for(j=0;j<strlen(sel[i]);j++)                    /* アンダーバーをス */
  138.         {                                                /* ペースに変換する。 */
  139.             if( *(sel[i]+j)=='_' )
  140.             {
  141.                 *(sel[i]+j)=' ';
  142.             }
  143.         }
  144.     }
  145.     
  146.     ret=select(sel_max);                                /* 選択ルーチンへ */
  147.     if(ret==-1)    ret=0;                    /* エスケープ終了は通常終了にする */
  148.     
  149.     txt_cls();
  150.     if(end_echo)                    /* end_echo が 0 以外ならメッセージ表示 */
  151.     {
  152.         printf(    "[select.exe] Ver 0.08  program : Y.Gotoh\n"
  153.                 "    returned error level [%d]\n",ret);
  154.     }
  155.     txt_cslon();
  156.     exit(ret);
  157. }
  158.  
  159. /* select : 項目選択用サブ ,*sel[] をグローバルで用意すること */
  160. int select(int sel_max)
  161. {
  162.     int sel_no=1,sel_bak=1,ret=0;
  163.     char key='\0';                            /* とりあえずループさせるために */
  164.     
  165.     locate(20,5);
  166.         printf("%s\n",sel[0]);                        /* メニュータイトル表示 */
  167.     
  168.     select_list(sel_max);                                        /* 一覧表示 */
  169.     select_prt(sel_no,sel_bak);            /* 初期位置(1)にカーソルを持ってくる */
  170.     
  171.     do
  172.     {
  173.         key=getch();
  174.         key=tolower(key);
  175.         
  176.         /* [↑,F,f]の時 */
  177.         if(key=='\x1e' || key=='\x66')
  178.         {
  179.             sel_bak=sel_no;
  180.             sel_no--;
  181.             if(sel_no<1) sel_no=sel_max;
  182.             select_prt(sel_no,sel_bak);
  183.         }
  184.         
  185.         /* [↓,J,j]の時 */
  186.         if(key == '\x1f' || key=='\x6a')
  187.         {
  188.             sel_bak=sel_no;
  189.             sel_no++;
  190.             if(sel_no>sel_max) sel_no=1;
  191.             select_prt(sel_no,sel_bak);
  192.         }
  193.         
  194.         /* 各数字(0~9)が押された時 */
  195.         if(key >= '\x30' && key <= '\x39')
  196.         {
  197.             sel_bak=sel_no;
  198.             sel_no=(int)key-0x30;
  199.             if(sel_no==0) sel_no=10;
  200.             if(sel_no>sel_max)
  201.             {
  202.                 sel_no=sel_bak;
  203.             }
  204.             else
  205.             {
  206.                 select_prt(sel_no,sel_bak);
  207.                 waitkey(20);
  208.                 key='\x0d';
  209.             }
  210.         }
  211.     }while(key != '\x0d' && key != '\x1b' && key != '\x20' && key != '\x71');
  212.     
  213.     if(key == '\x0d' || key == '\x20' )    ret=sel_no;    /* [space],[ret]なら
  214.                                                             選択番号を返す */
  215.     if(key == '\x71')    ret=0;                    /* [Q],[q]なら終了(ret=0) */
  216.     if(key == '\x1b')    ret=-1;                        /* [esc]なら-1を返す */
  217.     
  218.     return(ret);
  219. }
  220.  
  221. /* 選択肢一覧表示 */
  222. void select_list(int sel_max)
  223. {
  224.     int i;
  225.     
  226.     for(i=1;i<=sel_max;i++)
  227.     {
  228.         locate(19,i+6);
  229.         if(i<10)    printf("%1d: %s",i,sel[i]);
  230.             else    printf("%d: %s",i-10,sel[i]);    /* 10は、0と表示する */
  231.     }
  232. }
  233.  
  234. /* 選択カーソル表示ルーチン */
  235. void select_prt(int sel_no,int sel_bak)
  236. {
  237.     locate(19,sel_bak+6);                        /* 黄色の帯を消す */
  238.     if(sel_bak<10){
  239.         printf("%1d: %s",sel_bak,sel[sel_bak]);
  240.     }
  241.     else    printf("%1d: %s",sel_bak-10,sel[sel_bak]);    /* 10は0に */
  242.     
  243.     locate(19,sel_no+6);                            /* 新しく帯を引く */
  244.     if(sel_no<10){
  245.         printf("\x1b[7;33m%1d: %s\x1b[0;37m",sel_no,sel[sel_no]);
  246.     }
  247.     else    printf("\x1b[7;33m%1d: %s\x1b[0;37m",sel_no-10,sel[sel_no]);
  248. }
  249.  
  250. /* サブルーチン */
  251.  
  252. /* 何かキーを押すか一定時間経つと処理を復帰するサブ */
  253. void waitkey(int wait_time)
  254. {
  255.     int i=0;
  256.     
  257.     for(i=0;i<wait_time*10;i++)
  258.     {
  259.         if( kbhit() != 0)    break;
  260.     }
  261. }
  262.  
  263. void HELP(void)
  264. {
  265.     printf("%s",help);
  266.     exit(0);
  267. }
  268.